// sqrt 平方根
// 二分
// 二分是分两个分支
// 递归是递归 二分和递归不是一回事
// 方法 1 不考虑精度，返回整数
// c 为精度
// var mySqrt = function (x, c) {
//   let l = 0
//   let r = x

//   while (l <= r) {
//     let mid = l + (r - l) / 2
//     if (mid * mid <= x) {
//       if ((mid + c) ** 2 > x) return mid
//       l = mid + c
//     } else {
//       r = mid - c
//     }
//   }
//   return 0
// }

// let r = mySqrt(8, 0.0000001)
// console.log(r)

// 方法 2 考虑精度，返回 double 浮点数
var mySqrt = function (x, c) {
  if (x === 0 || x === 1) return x
  let l = 1
  let r = x
  let res
  while (l <= r) {
    let m = l + (r - l) / 2
    if (m === x / m) return m
    else if (m > x / m) {
      r = m - c
    } else {
      l = m + c
      res = m
    }
  }
  return res
}

let r = mySqrt(8, 0.0000001)
console.log(r)

// 方法 3 微积分 牛顿迭代
// var mySqrt = function (x) {
//   let r = x
//   while (r * r > x) {
//     r = (r + x / r) / 2
//   }
//   return r
// }

// let r = mySqrt(8)
// console.log(r)

// 扩展链接 关于牛顿积分求平方根的精度问题的更好代码思考
// https://www.beyond3d.com/content/articles/8/
